home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / PostScript / Pencil / Source / PencilInspector.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  8.9 KB  |  329 lines

  1. /*
  2. Pencil V1.0, Copyright 1994, 95 by Florian Marquardt.
  3. This program may be distributed under the terms of the GNU general
  4. public license (Start Pencil and select "Info>COPYING..." for a copy of the
  5. license).
  6. */
  7. #import "PencilInspector.h"
  8. #import "PencilView.h"
  9.  
  10. #import <remote/NXConnection.h>
  11. #import <remote/NXProxy.h>
  12.  
  13.  
  14. extern BOOL globalOutlines;
  15. BOOL globalTermination=NO;
  16. BOOL load_at_start=NO;
  17.  
  18. @implementation PencilInspector
  19. - appDidInit:sender
  20. {
  21.     [self initPopUpLists];
  22.         if (NXArgc > 1) {
  23.         [self openFile:NXArgv[1]];
  24.         } else  if(!load_at_start) [NXApp loadNibSection:"EmptyDocument.nib" owner:self];
  25.     return self;
  26. }
  27.  
  28. - (int)app:sender openFile:(const char *)path type:(const char *)type
  29. /*
  30.  * This method is performed whenever a user double-clicks on an icon
  31.  * in the Workspace Manager representing a .pencil file.
  32.  */
  33. {
  34.     if (type && !strcmp(type, "pencil")) {
  35.     [self openFile:path];
  36.     load_at_start=YES;
  37.     return YES;
  38.     }
  39.     return NO;
  40. }
  41.  
  42. - (BOOL)appAcceptsAnotherFile:(Application *)sender
  43. {
  44.     return YES;
  45. }
  46.  
  47. - appWillTerminate:sender
  48. {
  49.     id list,listv;
  50.     int i,j;
  51.  
  52.     globalTermination=YES;
  53.     list=[NXApp windowList];
  54.     for(i=[list count]-1;i>=0;i--)    {
  55.         if(listv=[[[list objectAt:i] contentView] subviews])
  56.         {
  57.             for(j=[listv count]-1;j>=0;j--) if([[listv objectAt:j] isMemberOf:[PencilView class]])    break;
  58.             if(j>=0)
  59.             {
  60.                 [[list objectAt:i] performClose:self];
  61.                 if(!globalTermination)    break;
  62.             }
  63.         }
  64.     }
  65.     if(globalTermination)
  66.         return self;
  67.     else
  68.         return nil;
  69. }
  70.  
  71. - initPopUpLists
  72. {
  73.     char filename[500];
  74.     NXStream *stream;
  75.     char txt[300], name[300];
  76.     int mode=0, n=-1;
  77.  
  78.     strcpy(filename, [[NXBundle mainBundle] directory]);
  79.     strcat(filename, "/../pencilMethodDescriptions");
  80.     stream=NXMapFile(filename, NX_READONLY);
  81.     if(!stream)
  82.     {
  83.     strcpy(filename, [[NXBundle mainBundle] directory]);
  84.     strcat(filename, "/pencilMethodDescriptions");
  85.     stream=NXMapFile(filename, NX_READONLY);
  86.     }
  87.         if(stream)
  88.         {
  89.         while(NXScanf(stream, "%[^:]:%[^\n]\n",txt,name)>0)
  90.         {
  91.         if(!strcmp(txt, "PATHMETHODS")) { mode=0; n=-1; }
  92.         else
  93.         if(!strcmp(txt, "DRAWMETHODS")) { mode=1; n=-1; }
  94.         else
  95.         if(!strcmp(txt, "FILLMETHODS")) { mode=2; n=-1; }
  96.         else
  97.         if(!strcmp(txt, "STROKEMETHODS")) { mode=3; n=-1; }
  98.         else
  99.         {
  100.         switch(mode)
  101.         {
  102.         case 0: [[[[[pathPopUp target] addItem:txt] setTarget:self] setAction:@selector(doChange:)] setTag:++n]; break;
  103.         case 1:  [[[[[drawPopUp target] addItem:txt] setTarget:self] setAction:@selector(doChange:)] setTag:++n]; break;
  104.         case 2: [[[[[fillPopUp target] addItem:txt] setTarget:self] setAction:@selector(doChange:)] setTag:++n]; break;
  105.         case 3: [[[[[strokePopUp target] addItem:txt] setTarget:self] setAction:@selector(doChange:)] setTag:++n]; break;
  106.         }
  107.         [self addName:(char *)name to:mode]; 
  108.         }
  109.         }
  110.         NXClose(stream);
  111.         [self findName:namelist[0][0] in:0];
  112.         [self findName:namelist[1][0] in:1];
  113.         [self findName:namelist[2][0] in:2];
  114.         [self findName:namelist[3][0] in:3];
  115.         [[pathPopUp target] removeItemAt:0];
  116.         [[drawPopUp target] removeItemAt:0];
  117.         [[fillPopUp target] removeItemAt:0];
  118.         [[strokePopUp target] removeItemAt:0];
  119.         }
  120.         else
  121.         {
  122.             NXRunAlertPanel("Alert", "Couldn't find pencilMethodDescriptions", "OK?!",NULL,NULL);
  123.             [NXApp terminate:self];
  124.         }
  125.     return self;
  126. }
  127.  
  128. - takeNew:sender
  129. {
  130.     if(view)
  131.     {
  132.     switch([sender tag])
  133.     {
  134.     case METHODNAME: [view setMethodname:[sender stringValue]]; break;
  135.     case COLOR1: [view setColor1:[sender color]]; break;
  136.     case COLOR2: [view setColor2:[sender color]]; break;
  137.     case LINEWIDTH: [view setLineWidth:[sender floatValue]]; break;
  138.     case DRAWMETHOD: [view setDrawingMethod:[sender stringValue]]; break;
  139.     case FILLMETHOD: [view setFillMethod:[sender stringValue]]; break;
  140.     case STROKEMETHOD: [view setStrokeMethod:[sender stringValue]]; break;
  141.     case SPECIALATTRIBUTES: [view setSpecialAttributes:[sender stringValue]]; break;
  142.     }
  143.     }
  144.     return self;
  145. }
  146.  
  147. - giveSettings:(char **)name:(NXColor *)col1:(NXColor *)col2:(float *)lw:(char **)dm:(char **)fm:(char **)sm:(char **)ud
  148. {
  149.     *name=[methodname stringValue];
  150.     *fm=[fillmethod stringValue];
  151.     *dm=[drawmethod stringValue];
  152.     *sm=[strokemethod stringValue];
  153.     *ud=[special stringValue];
  154.     *col1=[color1 color];
  155.     *col2=[color2 color];
  156.     *lw=[linewidth floatValue];
  157.     return self;
  158. }
  159.  
  160. - takeSettings:(char*)name:(NXColor)col1:(NXColor)col2:(float)lw:(char *)dm:(char *)fm:(char *)sm:(char *)ud
  161. {
  162.     [methodname setStringValue:name];
  163.     [self findName:name in:0];
  164.     [drawmethod setStringValue:dm];
  165.     [self findName:dm in:1];
  166.     [fillmethod setStringValue:fm];
  167.     [self findName:fm in:2];
  168.     [strokemethod setStringValue:sm];
  169.     [self findName:sm in:3];
  170.     [special setStringValue:ud];
  171.     [color1 setColor:col1];
  172.     [color2 setColor:col2];
  173.     [linewidth setFloatValue:lw];
  174.     return self;
  175. }
  176.  
  177. - addName:(char *)nm to:(int)lis
  178. {
  179.     if(namelist[lis])    namelist[lis]=(char **)realloc(namelist[lis], sizeof(char *)*(++namelistcount[lis])); else
  180.     namelist[lis]=(char **)malloc(sizeof(char *)*(namelistcount[lis]=1));
  181.     namelist[lis][namelistcount[lis]-1]=(char *)malloc(sizeof(char)*(strlen(nm)+1));
  182.     strcpy(namelist[lis][namelistcount[lis]-1], nm);
  183.     return self;
  184. }
  185.  
  186. - findName:(char *)nm in:(int)l
  187. {
  188.     int i;
  189.  
  190.     if(namelist[l])
  191.     {
  192.     for(i=0;i<namelistcount[l];i++) if(!strcmp(nm, (namelist[l])[i])) break;
  193.     if(i<namelistcount[l])
  194.         switch(l)
  195.         {
  196.         case 0: [[[pathPopUp target] itemList] selectCellWithTag:i]; [pathPopUp setTitle:[[[[pathPopUp target] itemList] selectedCell] title]]; break;
  197.         case 1: [[[drawPopUp target] itemList] selectCellWithTag:i]; [drawPopUp setTitle:[[[[drawPopUp target] itemList] selectedCell] title]];break;
  198.         case 2: [[[fillPopUp target] itemList] selectCellWithTag:i]; [fillPopUp setTitle:[[[[fillPopUp target] itemList] selectedCell] title]];break;
  199.         case 3: [[[strokePopUp target] itemList] selectCellWithTag:i]; [strokePopUp setTitle:[[[[strokePopUp target] itemList] selectedCell] title]];break;
  200.         }
  201.     }
  202.     return self;
  203. }
  204.  
  205. - doChange:sender
  206. {
  207.     int mode=0, tag;
  208.  
  209.     tag=[[sender selectedCell] tag];
  210.     sender=[sender window];
  211.     if(sender==[pathPopUp target]) mode=0;
  212.     if(sender==[drawPopUp target]) mode=1;
  213.     if(sender==[fillPopUp target]) mode=2;
  214.     if(sender==[strokePopUp target]) mode=3;
  215.     switch(mode)
  216.     {
  217.     case 0: if(view) [view setMethodname:(namelist[mode])[tag]]; [methodname setStringValue:(namelist[mode])[tag]]; break;
  218.     case 1: if(view) [view setDrawingMethod:(namelist[mode])[tag]]; [drawmethod setStringValue:(namelist[mode])[tag]]; break;
  219.     case 2: if(view) [view setFillMethod:(namelist[mode])[tag]]; [fillmethod setStringValue:(namelist[mode])[tag]]; break;
  220.     case 3: if(view) [view setStrokeMethod:(namelist[mode])[tag]]; [strokemethod setStringValue:(namelist[mode])[tag]]; break;
  221.     }
  222.     return self;
  223. }
  224. - athreshField { return aField; }
  225. - sthreshField { return sField; }
  226. - creationType { return cType; }
  227. - inspectForView:(id)v { view=v;     [view giveCustomTo:customPS];
  228. return self; }
  229. #define FOR(a) if(view) return [view a :sender]; else return self
  230. - toFront:sender { FOR(toFront); }
  231. - toBack:sender { FOR(toBack); }
  232. - insertPoint:sender { FOR(insertPoint); }
  233. - insertNextPoint:sender { FOR(insertNextPoint); }
  234. - deletePoint:sender { FOR(deletePoint); }
  235. - deleteGraphic:sender { FOR(deleteGraphic); }
  236. - saveAs:sender { FOR(saveAs); }
  237. - save:sender { FOR(save); }
  238. - toCharP:sender { FOR(convertToCharPath); }
  239. - print:sender { if(view) return [view printPSCode:sender]; else return self; }
  240. - open:sender
  241. {
  242.     const char *types[]={ "pencil", NULL };
  243.  
  244.     if([[OpenPanel new] runModalForTypes:types]==NX_OKTAG)
  245.     {
  246.         [self openFile:[[OpenPanel new] filename]];
  247.     }
  248.     return self;
  249. }
  250. - openFile:(char *)name
  251. {
  252.     [NXApp loadNibSection:"EmptyDocument.nib" owner:self];
  253.     [view readFromFilename:name];
  254.     [view giveCustomTo:customPS];
  255.     return self;
  256. }
  257.  
  258. - new:sender
  259. {
  260.     [NXApp loadNibSection:"EmptyDocument.nib" owner:self];
  261.     [customPS setText:""];
  262.     return self;
  263. }
  264.  
  265. - viewVanished:(id)v
  266. {
  267.     if(view==v)
  268.     {
  269.         view=nil;
  270.         [customPS setText:""];
  271.     }
  272.     return self;
  273. }
  274.  
  275. - executeCustom:sender
  276. {
  277.     if(view) [view takeCustomFrom:customPS];
  278.     return self;
  279. }
  280.  
  281. - setDrawOutlines:sender { globalOutlines=[sender state] ? YES:NO; if(view) [view displayWithCurrentGraphic]; return self; }
  282.  
  283. - copyAsPostScript:sender { if(view) [view copyAsPostScript:sender]; return self; }
  284.  
  285. - clearUserDef:sender
  286. {
  287.     [special setStringValue:""];
  288.     if(sender)
  289.         if(view) { [view takeCustomFrom:customPS]; [view displayWithCurrentGraphic]; }
  290.     return self;
  291. }
  292.  
  293. - setUserDef:(char *)udef
  294. {
  295.     [special setStringValue:udef];
  296.     return self;
  297. }
  298.  
  299. - importImage:sender
  300. {
  301.     if(view) [view importImage:sender];
  302.     return self;
  303. }
  304.  
  305. - registerAsTCLServer:sender
  306. {
  307.         if(!TCLconn)
  308.         {
  309.             TCLconn=[NXConnection registerRoot: self withName:"pencilTCLServer"];
  310.             [TCLconn runFromAppKit];
  311.         }
  312. }
  313.  
  314. - (char *)performCommand:(const char *)cmd
  315. {
  316.     if(!strcmp(cmd,"new")) { [self new:self]; return "1"; }
  317.     if(!strncmp(cmd, "open", 4)) {
  318.         char name[400];
  319.         sscanf(cmd, "open %s", name);
  320.         [NXApp loadNibSection:"EmptyDocument.nib" owner:self];
  321.         [view readFromFilename:name];
  322.         [view giveCustomTo:customPS];
  323.         return "1";
  324.     }
  325.     if(view) return([view performCommand:(const char *)cmd]);
  326.         else return "failed";
  327. }
  328. @end
  329.